home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
c
/
cuj9205.zip
/
1005114A
< prev
next >
Wrap
Text File
|
1992-06-02
|
2KB
|
95 lines
Listing 5
********
/* A header file */
struct s_number
{
int number_of_elements;
int overflow; /* Overflow (single bit) */
int sign; /* Sign (0 = positive, 1 = negative) */
long int element[]; /* Kept in least significant first order */
};
typedef struct s_number *NUMBER;
NUMBER new_number(long initial_long_value);
NUMBER add_numbers(NUMBER add1, NUMBER add2);
/* This is a short program with its use */
main()
{
NUMBER first_number;
NUMBER second_number;
NUMBER sum;
first_number = new_number(10000);
second_number = new_number(10000);
sum = add_numbers(first_number, second_number);
}
/* The routines */
NUMBER new_number(NUMBER number, long initial_long_value)
{
number = calloc(sizeof(struct s_number) + 1, 1);
if (number != NULL)
{
number->number_of_elements = 1;
number->element[0] = initial_long_value;
}
return number;
}
NUMBER add_numbers(NUMBER add1, NUMBER add2)
{
NUMBER sum;
int size_sum; /* Size of result */
int size_count; /* Size of smaller addend */
int i;
int overflow;
int sign;
int which_is_bigger;
/* Should check for overflow here and increase size_sum */
if (add1->number_of_elements > add2->number_of_elements)
{
size_sum = add1->number_of_elements;
size_count = add2->number_of_elements;
which_is_bigger = 1;
}
else
{
size_count = add1->number_of_elements;
size_sum = add2->number_of_elements;
which_is_bigger = 2;
}
/* Get a place for the result */
sum = calloc(sizeof(struct s_number) + size_sum, 1);
/* Do the addition - will need to check for overflow, sign, etc. */
for (i = 0; i < size_count++; i++)
{
/* Need to check for overflow */
sum->element[i] = add1->element[i] + add2->element[i] +
overflow;
}
/* Do the remainder of the larger addend */
for (i = size_count; i < size_sum; i++)
{
if (which_is_bigger == 1)
sum->element[i] = add1->element[i] + overflow;
else
sum->element[i] = add2->element[i] + overflow;
overflow = 0;
}
/* Need to test overflow of the larger addend and set sum here */
return sum;
}